home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / var / lib / dpkg / info / xfonts-utils.postinst < prev    next >
Text File  |  2008-06-17  |  30KB  |  923 lines

  1. #! /bin/sh
  2.  
  3. set -e
  4.  
  5. THIS_PACKAGE=xfonts-utils
  6. THIS_SCRIPT=postinst
  7.  
  8. # $Id$
  9.  
  10. # This is the X Strike Force shell library for X Window System package
  11. # maintainer scripts.  It serves to define shell functions commonly used by
  12. # such packages, and performs some error checking necessary for proper operation
  13. # of those functions.  By itself, it does not "do" much; the maintainer scripts
  14. # invoke the functions defined here to accomplish package installation and
  15. # removal tasks.
  16.  
  17. # If you are reading this within a Debian package maintainer script (e.g.,
  18. # /var/lib/dpkg)info/PACKAGE.{config,preinst,postinst,prerm,postrm}), you can
  19. # skip past this library by scanning forward in this file to the string
  20. # "GOBSTOPPER".
  21.  
  22. SOURCE_VERSION=1:7.4+1ubuntu1
  23. OFFICIAL_BUILD=
  24.  
  25. # Use special abnormal exit codes so that problems with this library are more
  26. # easily tracked down.
  27. SHELL_LIB_INTERNAL_ERROR=86
  28. SHELL_LIB_THROWN_ERROR=74
  29. SHELL_LIB_USAGE_ERROR=99
  30.  
  31. # old -> new variable names
  32. if [ -z "$DEBUG_XORG_PACKAGE" ] && [ -n "$DEBUG_XFREE86_PACKAGE" ]; then
  33.   DEBUG_XORG_PACKAGE="$DEBUG_XFREE86_PACKAGE"
  34. fi
  35. if [ -z "$DEBUG_XORG_DEBCONF" ] && [ -n "$DEBUG_XFREE86_DEBCONF" ]; then
  36.   DEBUG_XORG_DEBCONF="$DEBUG_XFREE86_DEBCONF"
  37. fi
  38.  
  39. # initial sanity checks
  40. if [ -z "$THIS_PACKAGE" ]; then
  41.   cat >&2 <<EOF
  42. Error: package maintainer script attempted to use shell library without
  43. definining \$THIS_PACKAGE shell variable.  Please report the package name,
  44. version, and the text of this error message to the Debian Bug Tracking System.
  45. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  46. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  47. "doc-debian" package, or install the "reportbug" package and use the command of
  48. the same name to file a report against version $SOURCE_VERSION of this package.
  49. EOF
  50.   exit $SHELL_LIB_USAGE_ERROR
  51. fi
  52.  
  53. if [ -z "$THIS_SCRIPT" ]; then
  54.   cat >&2 <<EOF
  55. Error: package maintainer script attempted to use shell library without
  56. definining \$THIS_SCRIPT shell variable.  Please report the package name,
  57. version, and the text of this error message to the Debian Bug Tracking System.
  58. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  59. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  60. "doc-debian" package, or install the "reportbug" package and use the command of
  61. the same name to file a report against version $SOURCE_VERSION of the
  62. "$THIS_PACKAGE" package.
  63. EOF
  64.   exit $SHELL_LIB_USAGE_ERROR
  65. fi
  66.  
  67. ARCHITECTURE="$(dpkg --print-installation-architecture)"
  68.  
  69. if [ "$1" = "reconfigure" ] || [ -n "$DEBCONF_RECONFIGURE" ]; then
  70.   RECONFIGURE="true"
  71. else
  72.   RECONFIGURE=
  73. fi
  74.  
  75. if ([ "$1" = "install" ] || [ "$1" = "configure" ]) && [ -z "$2" ]; then
  76.   FIRSTINST="yes"
  77. fi
  78.  
  79. if [ -z "$RECONFIGURE" ] && [ -z "$FIRSTINST" ]; then
  80.   UPGRADE="yes"
  81. fi
  82.  
  83. trap "message;\
  84.       message \"Received signal.  Aborting $THIS_PACKAGE package $THIS_SCRIPT script.\";\
  85.       message;\
  86.       exit 1" HUP INT QUIT TERM
  87.  
  88. reject_nondigits () {
  89.   # syntax: reject_nondigits [ operand ... ]
  90.   #
  91.   # scan operands (typically shell variables whose values cannot be trusted) for
  92.   # characters other than decimal digits and barf if any are found
  93.   while [ -n "$1" ]; do
  94.     # does the operand contain anything but digits?
  95.     if ! expr "$1" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  96.       # can't use die(), because it wraps message() which wraps this function
  97.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_nondigits() encountered" \
  98.            "possibly malicious garbage \"$1\"" >&2
  99.       exit $SHELL_LIB_THROWN_ERROR
  100.     fi
  101.     shift
  102.   done
  103. }
  104.  
  105. reject_whitespace () {
  106.   # syntax: reject_whitespace [ operand ]
  107.   #
  108.   # scan operand (typically a shell variable whose value cannot be trusted) for
  109.   # whitespace characters and barf if any are found
  110.   if [ -n "$1" ]; then
  111.     # does the operand contain any whitespace?
  112.     if expr "$1" : "[[:space:]]" > /dev/null 2>&1; then
  113.       # can't use die(), because I want to avoid forward references
  114.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_whitespace() encountered" \
  115.            "possibly malicious garbage \"$1\"" >&2
  116.       exit $SHELL_LIB_THROWN_ERROR
  117.     fi
  118.   fi
  119. }
  120.  
  121. reject_unlikely_path_chars () {
  122.   # syntax: reject_unlikely_path_chars [ operand ... ]
  123.   #
  124.   # scan operands (typically shell variables whose values cannot be trusted) for
  125.   # characters unlikely to be seen in a path and which the shell might
  126.   # interpret and barf if any are found
  127.   while [ -n "$1" ]; do
  128.     # does the operand contain any funny characters?
  129.     if expr "$1" : '.*[!$&()*;<>?|].*' > /dev/null 2>&1; then
  130.       # can't use die(), because I want to avoid forward references
  131.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_unlikely_path_chars()" \
  132.            "encountered possibly malicious garbage \"$1\"" >&2
  133.       exit $SHELL_LIB_THROWN_ERROR
  134.     fi
  135.     shift
  136.   done
  137. }
  138.  
  139. # Query the terminal to establish a default number of columns to use for
  140. # displaying messages to the user.  This is used only as a fallback in the
  141. # event the COLUMNS variable is not set.  ($COLUMNS can react to SIGWINCH while
  142. # the script is running, and this cannot, only being calculated once.)
  143. DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true
  144. if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  145.   DEFCOLUMNS=80
  146. fi
  147.  
  148. message () {
  149.   # pretty-print messages of arbitrary length
  150.   reject_nondigits "$COLUMNS"
  151.   echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2
  152. }
  153.  
  154. observe () {
  155.   # syntax: observe message ...
  156.   #
  157.   # issue observational message suitable for logging someday when support for
  158.   # it exists in dpkg
  159.   if [ -n "$DEBUG_XORG_PACKAGE" ]; then
  160.     message "$THIS_PACKAGE $THIS_SCRIPT note: $*"
  161.   fi
  162. }
  163.  
  164. warn () {
  165.   # syntax: warn message ...
  166.   #
  167.   # issue warning message suitable for logging someday when support for
  168.   # it exists in dpkg; also send to standard error
  169.   message "$THIS_PACKAGE $THIS_SCRIPT warning: $*"
  170. }
  171.  
  172. die () {
  173.   # syntax: die message ...
  174.   #
  175.   # exit script with error message
  176.   message "$THIS_PACKAGE $THIS_SCRIPT error: $*"
  177.   exit $SHELL_LIB_THROWN_ERROR
  178. }
  179.  
  180. internal_error () {
  181.   # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
  182.   message "internal error: $*"
  183.   if [ -n "$OFFICIAL_BUILD" ]; then
  184.     message "Please report a bug in the $THIS_SCRIPT script of the" \
  185.             "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  186.             "Tracking System.  Include all messages above that mention the" \
  187.             "$THIS_PACKAGE package.  Visit " \
  188.             "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  189.             "instructions, read the file" \
  190.             "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  191.             "package, or install the reportbug package and use the command of" \
  192.             "the same name to file a report."
  193.   fi
  194.   exit $SHELL_LIB_INTERNAL_ERROR
  195. }
  196.  
  197. usage_error () {
  198.   message "usage error: $*"
  199.   message "Please report a bug in the $THIS_SCRIPT script of the" \
  200.           "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  201.           "Tracking System.  Include all messages above that mention the" \
  202.           "$THIS_PACKAGE package.  Visit " \
  203.           "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  204.           "instructions, read the file" \
  205.           "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  206.           "package, or install the reportbug package and use the command of" \
  207.           "the same name to file a report."
  208.   exit $SHELL_LIB_USAGE_ERROR
  209. }
  210.  
  211.  
  212. maplink () {
  213.   # returns what symlink should point to; i.e., what the "sane" answer is
  214.   # Keep this in sync with the debian/*.links files.
  215.   # This is only needed for symlinks to directories.
  216.   #
  217.   # XXX: Most of these look wrong in the X11R7 world and need to be fixed.
  218.   # If we've stopped using this function, fixing it might enable us to re-enable
  219.   # it again and catch more errors.
  220.   case "$1" in
  221.     /etc/X11/xkb/compiled) echo /var/lib/xkb ;;
  222.     /etc/X11/xkb/xkbcomp) echo /usr/X11R6/bin/xkbcomp ;;
  223.     /usr/X11R6/lib/X11/app-defaults) echo /etc/X11/app-defaults ;;
  224.     /usr/X11R6/lib/X11/fs) echo /etc/X11/fs ;;
  225.     /usr/X11R6/lib/X11/lbxproxy) echo /etc/X11/lbxproxy ;;
  226.     /usr/X11R6/lib/X11/proxymngr) echo /etc/X11/proxymngr ;;
  227.     /usr/X11R6/lib/X11/rstart) echo /etc/X11/rstart ;;
  228.     /usr/X11R6/lib/X11/twm) echo /etc/X11/twm ;;
  229.     /usr/X11R6/lib/X11/xdm) echo /etc/X11/xdm ;;
  230.     /usr/X11R6/lib/X11/xinit) echo /etc/X11/xinit ;;
  231.     /usr/X11R6/lib/X11/xkb) echo /etc/X11/xkb ;;
  232.     /usr/X11R6/lib/X11/xserver) echo /etc/X11/xserver ;;
  233.     /usr/X11R6/lib/X11/xsm) echo /etc/X11/xsm ;;
  234.     /usr/bin/X11) echo ../X11R6/bin ;;
  235.     /usr/bin/rstartd) echo ../X11R6/bin/rstartd ;;
  236.     /usr/include/X11) echo ../X11R6/include/X11 ;;
  237.     /usr/lib/X11) echo ../X11R6/lib/X11 ;;
  238.     *) internal_error "maplink() called with unknown path \"$1\"" ;;
  239.   esac
  240. }
  241.  
  242. analyze_path () {
  243.   # given a supplied set of pathnames, break each one up by directory and do an
  244.   # ls -dl on each component, cumulatively; i.e.
  245.   # analyze_path /usr/X11R6/bin -> ls -dl /usr /usr/X11R6 /usr/X11R6/bin
  246.   # Thanks to Randolph Chung for this clever hack.
  247.  
  248.   #local f g
  249.  
  250.   while [ -n "$1" ]; do
  251.     reject_whitespace "$1"
  252.     _g=
  253.     message "Analyzing $1:"
  254.     for _f in $(echo "$1" | tr / \  ); do
  255.       if [ -e /$_g$_f ]; then
  256.         ls -dl /$_g$_f /$_g$_f.dpkg-* 2> /dev/null || true
  257.         _g=$_g$_f/
  258.       else
  259.         message "/$_g$_f: nonexistent; directory contents of /$_g:"
  260.         ls -l /$_g
  261.         break
  262.       fi
  263.     done
  264.     shift
  265.   done
  266. }
  267.  
  268. find_culprits () {
  269.   #local f p dpkg_info_dir possible_culprits smoking_guns bad_packages package \
  270.   #  msg
  271.  
  272.   reject_whitespace "$1"
  273.   message "Searching for overlapping packages..."
  274.   _dpkg_info_dir=/var/lib/dpkg/info
  275.   if [ -d $_dpkg_info_dir ]; then
  276.     if [ "$(echo $_dpkg_info_dir/*.list)" != "$_dpkg_info_dir/*.list" ]; then
  277.       _possible_culprits=$(ls -1 $_dpkg_info_dir/*.list | egrep -v \
  278.         "(xbase-clients|x11-common|xfs|xlibs)")
  279.       if [ -n "$_possible_culprits" ]; then
  280.         _smoking_guns=$(grep -l "$1" $_possible_culprits || true)
  281.         if [ -n "$_smoking_guns" ]; then
  282.           _bad_packages=$(printf "\\n")
  283.           for f in $_smoking_guns; do
  284.             # too bad you can't nest parameter expansion voodoo
  285.             p=${f%*.list}      # strip off the trailing ".list"
  286.             _package=${p##*/}   # strip off the directories
  287.             _bad_packages=$(printf "%s\n%s" "$_bad_packages" "$_package")
  288.           done
  289.           _msg=$(cat <<EOF
  290. The following packages appear to have file overlaps with the X.Org packages;
  291. these packages are either very old, or in violation of Debian Policy.  Try
  292. upgrading each of these packages to the latest available version if possible:
  293. for example, with the command "apt-get install".  If no newer version of a
  294. package is available, you will have to remove it; for example, with the command
  295. "apt-get remove".  If even the latest available version of the package has
  296. this file overlap, please file a bug against that package with the Debian Bug
  297. Tracking System.  You may want to refer the package maintainer to section 12.8
  298. of the Debian Policy manual.
  299. EOF
  300. )
  301.           message "$_msg"
  302.           message "The overlapping packages are: $_bad_packages"
  303.         else
  304.           message "no overlaps found."
  305.         fi
  306.       fi
  307.     else
  308.       message "cannot search; no matches for $_dpkg_info_dir/*.list."
  309.     fi
  310.   else
  311.     message "cannot search; $_dpkg_info_dir does not exist."
  312.   fi
  313. }
  314.  
  315. # we require a readlink command or shell function
  316. if ! which readlink > /dev/null 2>&1; then
  317.   message "The readlink command was not found.  Please install version" \
  318.           "1.13.1 or later of the debianutils package."
  319.   readlink () {
  320.     # returns what symlink in $1 actually points to
  321.     perl -e '$l = shift; exit 1 unless -l $l; $r = readlink $l; exit 1 unless $r; print "$r\n"' "$1"
  322.   }
  323. fi
  324.  
  325. check_symlink () {
  326.   # syntax: check_symlink symlink
  327.   #
  328.   # See if specified symlink points where it is supposed to.  Return 0 if it
  329.   # does, and 1 if it does not.
  330.   #
  331.   # Primarily used by check_symlinks_and_warn() and check_symlinks_and_bomb().
  332.  
  333.   #local symlink
  334.  
  335.   # validate arguments
  336.   if [ $# -ne 1 ]; then
  337.     usage_error "check_symlink() called with wrong number of arguments;" \
  338.                 "expected 1, got $#"
  339.     exit $SHELL_LIB_USAGE_ERROR
  340.   fi
  341.  
  342.   _symlink="$1"
  343.  
  344.   if [ "$(maplink "$_symlink")" = "$(readlink "$_symlink")" ]; then
  345.     return 0
  346.   else
  347.     return 1
  348.   fi
  349. }
  350.  
  351. check_symlinks_and_warn () {
  352.   # syntax: check_symlinks_and_warn symlink ...
  353.   #
  354.   # For each argument, check for symlink sanity, and warn if it isn't sane.
  355.   #
  356.   # Call this function from a preinst script in the event $1 is "upgrade" or
  357.   # "install".
  358.  
  359.   #local errmsg symlink
  360.  
  361.   # validate arguments
  362.   if [ $# -lt 1 ]; then
  363.     usage_error "check_symlinks_and_warn() called with wrong number of" \
  364.                 "arguments; expected at least 1, got $#"
  365.     exit $SHELL_LIB_USAGE_ERROR
  366.   fi
  367.  
  368.   while [ -n "$1" ]; do
  369.     _symlink="$1"
  370.     if [ -L "$_symlink" ]; then
  371.       if ! check_symlink "$_symlink"; then
  372.         observe "$_symlink symbolic link points to wrong location" \
  373.                 "$(readlink "$_symlink"); removing"
  374.         rm "$_symlink"
  375.       fi
  376.     elif [ -e "$_symlink" ]; then
  377.       _errmsg="$_symlink exists and is not a symbolic link; this package cannot"
  378.       _errmsg="$_errmsg be installed until this"
  379.       if [ -f "$_symlink" ]; then
  380.         _errmsg="$_errmsg file"
  381.       elif [ -d "$_symlink" ]; then
  382.         _errmsg="$_errmsg directory"
  383.       else
  384.         _errmsg="$_errmsg thing"
  385.       fi
  386.       _errmsg="$_errmsg is removed"
  387.       die "$_errmsg"
  388.     fi
  389.     shift
  390.   done
  391. }
  392.  
  393. check_symlinks_and_bomb () {
  394.   # syntax: check_symlinks_and_bomb symlink ...
  395.   #
  396.   # For each argument, check for symlink sanity, and bomb if it isn't sane.
  397.   #
  398.   # Call this function from a postinst script.
  399.  
  400.   #local problem symlink
  401.  
  402.   # validate arguments
  403.   if [ $# -lt 1 ]; then
  404.     usage_error "check_symlinks_and_bomb() called with wrong number of"
  405.                 "arguments; expected at least 1, got $#"
  406.     exit $SHELL_LIB_USAGE_ERROR
  407.   fi
  408.  
  409.   while [ -n "$1" ]; do
  410.     _problem=
  411.     _symlink="$1"
  412.     if [ -L "$_symlink" ]; then
  413.       if ! check_symlink "$_symlink"; then
  414.         _problem=yes
  415.         warn "$_symlink symbolic link points to wrong location" \
  416.              "$(readlink "$_symlink")"
  417.       fi
  418.     elif [ -e "$_symlink" ]; then
  419.       _problem=yes
  420.       warn "$_symlink is not a symbolic link"
  421.     else
  422.       _problem=yes
  423.       warn "$_symlink symbolic link does not exist"
  424.     fi
  425.     if [ -n "$_problem" ]; then
  426.       analyze_path "$_symlink" "$(readlink "$_symlink")"
  427.       find_culprits "$_symlink"
  428.       die "bad symbolic links on system"
  429.     fi
  430.     shift
  431.   done
  432. }
  433.  
  434. font_update () {
  435.   # run $UPDATECMDS in $FONTDIRS
  436.  
  437.   #local dir cmd shortcmd x_font_dir_prefix
  438.  
  439.   _x_font_dir_prefix="/usr/share/fonts/X11"
  440.  
  441.   if [ -z "$UPDATECMDS" ]; then
  442.     usage_error "font_update() called but \$UPDATECMDS not set"
  443.   fi
  444.   if [ -z "$FONTDIRS" ]; then
  445.     usage_error "font_update() called but \$FONTDIRS not set"
  446.   fi
  447.  
  448.   reject_unlikely_path_chars "$UPDATECMDS"
  449.   reject_unlikely_path_chars "$FONTDIRS"
  450.  
  451.   for _dir in $FONTDIRS; do
  452.     if [ -d "$_x_font_dir_prefix/$_dir" ]; then
  453.       for _cmd in $UPDATECMDS; do
  454.         if which "$_cmd" > /dev/null 2>&1; then
  455.           _shortcmd=${_cmd##*/}
  456.           observe "running $_shortcmd in $_dir font directory"
  457.       _cmd_opts=
  458.           if [ "$_shortcmd" = "update-fonts-alias" ]; then
  459.             _cmd_opts=--x11r7-layout
  460.           fi
  461.           if [ "$_shortcmd" = "update-fonts-dir" ]; then
  462.             _cmd_opts=--x11r7-layout
  463.           fi
  464.           if [ "$_shortcmd" = "update-fonts-scale" ]; then
  465.             _cmd_opts=--x11r7-layout
  466.           fi
  467.           $_cmd $_cmd_opts $_dir || warn "$_cmd $_cmd_opts $_dir" \
  468.                               "failed; font directory data may not" \
  469.                               "be up to date"
  470.         else
  471.           warn "$_cmd not found; not updating corresponding $_dir font" \
  472.                "directory data"
  473.         fi
  474.       done
  475.     else
  476.       warn "$_dir is not a directory; not updating font directory data"
  477.     fi
  478.   done
  479. }
  480.  
  481. remove_conffile_prepare () {
  482.   # syntax: remove_conffile_prepare filename official_md5sum ...
  483.   #
  484.   # Check a conffile "filename" against a list of canonical MD5 checksums.
  485.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  486.   # operands provided, then prepare the conffile for removal from the system.
  487.   # We defer actual deletion until the package is configured so that we can
  488.   # roll this operation back if package installation fails.
  489.   #
  490.   # Call this function from a preinst script in the event $1 is "upgrade" or
  491.   # "install" and verify $2 to ensure the package is being upgraded from a
  492.   # version (or installed over a version removed-but-not-purged) prior to the
  493.   # one in which the conffile was obsoleted.
  494.  
  495.   #local conffile current_checksum
  496.  
  497.   # validate arguments
  498.   if [ $# -lt 2 ]; then
  499.     usage_error "remove_conffile_prepare() called with wrong number of" \
  500.                 "arguments; expected at least 2, got $#"
  501.     exit $SHELL_LIB_USAGE_ERROR
  502.   fi
  503.  
  504.   _conffile="$1"
  505.   shift
  506.  
  507.   # does the _conffile even exist?
  508.   if [ -e "$_conffile" ]; then
  509.     # calculate its checksum
  510.     _current_checksum=$(md5sum < "$_conffile" | sed 's/[[:space:]].*//')
  511.     # compare it to each supplied checksum
  512.     while [ -n "$1" ]; do
  513.       if [ "$_current_checksum" = "$1" ]; then
  514.         # we found a match; move the confffile and stop looking
  515.         observe "preparing obsolete conffile $_conffile for removal"
  516.         mv "$_conffile" "$_conffile.$THIS_PACKAGE-tmp"
  517.         break
  518.       fi
  519.       shift
  520.     done
  521.   fi
  522. }
  523.  
  524. remove_conffile_commit () {
  525.   # syntax: remove_conffile_commit filename
  526.   #
  527.   # Complete the removal of a conffile "filename" that has become obsolete.
  528.   #
  529.   # Call this function from a postinst script after having used
  530.   # remove_conffile_prepare() in the preinst.
  531.  
  532.   #local conffile
  533.  
  534.   # validate arguments
  535.   if [ $# -ne 1 ]; then
  536.     usage_error "remove_conffile_commit() called with wrong number of" \
  537.                 "arguments; expected 1, got $#"
  538.     exit $SHELL_LIB_USAGE_ERROR
  539.   fi
  540.  
  541.   _conffile="$1"
  542.  
  543.   # if the temporary file created by remove_conffile_prepare() exists, remove it
  544.   if [ -e "$_conffile.$THIS_PACKAGE-tmp" ]; then
  545.     observe "committing removal of obsolete conffile $_conffile"
  546.     rm "$_conffile.$THIS_PACKAGE-tmp"
  547.   fi
  548. }
  549.  
  550. remove_conffile_rollback () {
  551.   # syntax: remove_conffile_rollback filename
  552.   #
  553.   # Roll back the removal of a conffile "filename".
  554.   #
  555.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  556.   # or "abort-install" is  after having used remove_conffile_prepare() in the
  557.   # preinst.
  558.  
  559.   #local conffile
  560.  
  561.   # validate arguments
  562.   if [ $# -ne 1 ]; then
  563.     usage_error "remove_conffile_rollback() called with wrong number of" \
  564.                 "arguments; expected 1, got $#"
  565.     exit $SHELL_LIB_USAGE_ERROR
  566.   fi
  567.  
  568.   _conffile="$1"
  569.  
  570.   # if the temporary file created by remove_conffile_prepare() exists, move it
  571.   # back
  572.   if [ -e "$_conffile.$THIS_PACKAGE-tmp" ]; then
  573.     observe "rolling back removal of obsolete conffile $_conffile"
  574.     mv "$_conffile.$THIS_PACKAGE-tmp" "$_conffile"
  575.   fi
  576. }
  577.  
  578. replace_conffile_with_symlink_prepare () {
  579.   # syntax: replace_conffile_with_symlink_prepare oldfilename newfilename \
  580.   # official_md5sum ...
  581.   #
  582.   # Check a conffile "oldfilename" against a list of canonical MD5 checksums.
  583.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  584.   # operands provided, then prepare the conffile for removal from the system.
  585.   # We defer actual deletion until the package is configured so that we can
  586.   # roll this operation back if package installation fails. Otherwise copy it
  587.   # to newfilename and let dpkg handle it through conffiles mechanism.
  588.   #
  589.   # Call this function from a preinst script in the event $1 is "upgrade" or
  590.   # "install" and verify $2 to ensure the package is being upgraded from a
  591.   # version (or installed over a version removed-but-not-purged) prior to the
  592.   # one in which the conffile was obsoleted.
  593.  
  594.   #local conffile current_checksum
  595.  
  596.   # validate arguments
  597.   if [ $# -lt 3 ]; then
  598.     usage_error "replace_conffile_with_symlink_prepare() called with wrong" \
  599.                 " number of arguments; expected at least 3, got $#"
  600.     exit $SHELL_LIB_USAGE_ERROR
  601.   fi
  602.  
  603.   _oldconffile="$1"
  604.   shift
  605.   _newconffile="$1"
  606.   shift
  607.  
  608.   remove_conffile_prepare "$_oldconffile" "$@"
  609.   # If $_oldconffile still exists, then md5sums didn't match.
  610.   # Copy it to new one.
  611.   if [ -f "$_oldconffile" ]; then
  612.     cp "$_oldconffile" "$_newconffile"
  613.   fi
  614.  
  615. }
  616.  
  617. replace_conffile_with_symlink_commit () {
  618.   # syntax: replace_conffile_with_symlink_commit oldfilename
  619.   #
  620.   # Complete the removal of a conffile "oldfilename" that has been
  621.   # replaced by a symlink.
  622.   #
  623.   # Call this function from a postinst script after having used
  624.   # replace_conffile_with_symlink_prepare() in the preinst.
  625.  
  626.   #local conffile
  627.  
  628.   # validate arguments
  629.   if [ $# -ne 1 ]; then
  630.     usage_error "replace_conffile_with_symlink_commit() called with wrong" \
  631.                 "number of arguments; expected 1, got $#"
  632.     exit $SHELL_LIB_USAGE_ERROR
  633.   fi
  634.  
  635.   _conffile="$1"
  636.  
  637.   remove_conffile_commit "$_conffile"
  638. }
  639.  
  640. replace_conffile_with_symlink_rollback () {
  641.   # syntax: replace_conffile_with_symlink_rollback oldfilename newfilename
  642.   #
  643.   # Roll back the replacing of a conffile "oldfilename" with symlink to
  644.   # "newfilename".
  645.   #
  646.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  647.   # or "abort-install" and verify $2 to ensure the package failed to upgrade
  648.   # from a version (or install over a version removed-but-not-purged) prior
  649.   # to the one in which the conffile was obsoleted.
  650.   # You should have  used replace_conffile_with_symlink_prepare() in the
  651.   # preinst.
  652.  
  653.   #local conffile
  654.  
  655.   # validate arguments
  656.   if [ $# -ne 2 ]; then
  657.     usage_error "replace_conffile_with_symlink_rollback() called with wrong" \
  658.                 "number of arguments; expected 2, got $#"
  659.     exit $SHELL_LIB_USAGE_ERROR
  660.   fi
  661.  
  662.   _oldconffile="$1"
  663.   _newconffile="$2"
  664.  
  665.   remove_conffile_rollback "$_oldconffile"
  666.   if [ -f "$_newconffile" ]; then
  667.     rm "$_newconffile"
  668.   fi
  669. }
  670.  
  671. run () {
  672.   # syntax: run command [ argument ... ]
  673.   #
  674.   # Run specified command with optional arguments and report its exit status.
  675.   # Useful for commands whose exit status may be nonzero, but still acceptable,
  676.   # or commands whose failure is not fatal to us.
  677.   #
  678.   # NOTE: Do *not* use this function with db_get or db_metaget commands; in
  679.   # those cases the return value of the debconf command *must* be checked
  680.   # before the string returned by debconf is used for anything.
  681.  
  682.   #local retval
  683.  
  684.   # validate arguments
  685.   if [ $# -lt 1 ]; then
  686.     usage_error "run() called with wrong number of arguments; expected at" \
  687.                 "least 1, got $#"
  688.     exit $SHELL_LIB_USAGE_ERROR
  689.   fi
  690.  
  691.   "$@" || _retval=$?
  692.  
  693.   if [ ${_retval:-0} -ne 0 ]; then
  694.     observe "command \"$*\" exited with status $_retval"
  695.   fi
  696. }
  697.  
  698. register_x_lib_dir_with_ld_so () {
  699.   # syntax: register_x_lib_dir_with_ld_so
  700.   #
  701.   # Configure the dynamic loader ld.so to search /usr/X11R6/lib for shared
  702.   # libraries.
  703.   #
  704.   # Call this function from the postinst script of a package that places a
  705.   # shared library in /usr/X11R6/lib, before invoking ldconfig.
  706.  
  707.   #local dir ldsoconf
  708.  
  709.   _dir="/usr/X11R6/lib"
  710.   _ldsoconf="/etc/ld.so.conf"
  711.  
  712.   # is the line not already present?
  713.   if ! fgrep -qsx "$_dir" "$_ldsoconf"; then
  714.     observe "adding $_dir directory to $_ldsoconf"
  715.     echo "$_dir" >> "$_ldsoconf"
  716.   fi
  717. }
  718.  
  719. deregister_x_lib_dir_with_ld_so () {
  720.   # syntax: deregister_x_lib_dir_with_ld_so
  721.   #
  722.   # Configure dynamic loader ld.so to not search /usr/X11R6/lib for shared
  723.   # libraries, if and only if no shared libaries remain there.
  724.   #
  725.   # Call this function from the postrm script of a package that places a shared
  726.   # library in /usr/X11R6/lib, in the event "$1" is "remove", and before
  727.   # invoking ldconfig.
  728.  
  729.   #local dir ldsoconf fgrep_status cmp_status
  730.  
  731.   _dir="/usr/X11R6/lib"
  732.   _ldsoconf="/etc/ld.so.conf"
  733.  
  734.   # is the line present?
  735.   if fgrep -qsx "$_dir" "$_ldsoconf"; then
  736.     # are there any shared objects in the directory?
  737.     if [ "$(echo "$_dir"/lib*.so.*.*)" = "$_dir/lib*.so.*.*" ]; then
  738.       # glob expansion produced nothing, so no shared libraries are present
  739.       observe "removing $_dir directory from $_ldsoconf"
  740.       # rewrite the file (very carefully)
  741.       set +e
  742.       fgrep -svx "$_dir" "$_ldsoconf" > "$_ldsoconf.dpkg-tmp"
  743.       _fgrep_status=$?
  744.       set -e
  745.       case $_fgrep_status in
  746.         0|1) ;; # we don't actually care if any lines matched or not
  747.         *) die "error reading \"$_ldsoconf\"; fgrep exited with status" \
  748.           "$_fgrep_status" ;;
  749.       esac
  750.       set +e
  751.       cmp -s "$_ldsoconf.dpkg-tmp" "$_ldsoconf"
  752.       _cmp_status=$?
  753.       set -e
  754.       case $_cmp_status in
  755.         0) rm "$_ldsoconf.dpkg-tmp" ;; # files are identical
  756.         1) mv "$_ldsoconf.dpkg-tmp" "$_ldsoconf" ;; # files differ
  757.         *) die "error comparing \"$_ldsoconf.dpkg-tmp\" to \"$_ldsoconf\";" \
  758.           "cmp exited with status $_cmp_status" ;;
  759.       esac
  760.     fi
  761.   fi
  762. }
  763.  
  764. make_symlink_sane () {
  765.   # syntax: make_symlink_sane symlink target
  766.   #
  767.   # Ensure that the symbolic link symlink exists, and points to target.
  768.   #
  769.   # If symlink does not exist, create it and point it at target.
  770.   #
  771.   # If symlink exists but is not a symbolic link, back it up.
  772.   #
  773.   # If symlink exists, is a symbolic link, but points to the wrong location, fix
  774.   # it.
  775.   #
  776.   # If symlink exists, is a symbolic link, and already points to target, do
  777.   # nothing.
  778.   #
  779.   # This function wouldn't be needed if ln had an -I, --idempotent option.
  780.  
  781.   # Validate arguments.
  782.   if [ $# -ne 2 ]; then
  783.     usage_error "make_symlink_sane() called with wrong number of arguments;" \
  784.       "expected 2, got $#"
  785.     exit $SHELL_LIB_USAGE_ERROR
  786.   fi
  787.  
  788.   # We could just use the positional parameters as-is, but that makes things
  789.   # harder to follow.
  790.   #local symlink target
  791.  
  792.   _symlink="$1"
  793.   _target="$2"
  794.  
  795.   if [ -L "$_symlink" ] && [ "$(readlink "$_symlink")" = "$_target" ]; then
  796.       observe "link from $_symlink to $_target already exists"
  797.   else
  798.     observe "creating symbolic link from $_symlink to $_target"
  799.     mkdir -p "${_target%/*}" "${_symlink%/*}"
  800.     ln -s -b -S ".dpkg-old" "$_target" "$_symlink"
  801.   fi
  802. }
  803.  
  804. migrate_dir_to_symlink () {
  805.   # syntax: migrate_dir_to_symlink old_location new_location
  806.   #
  807.   # Per Debian Policy section 6.5.4, "A directory will never be replaced by a
  808.   # symbolic link to a directory or vice versa; instead, the existing state
  809.   # (symlink or not) will be left alone and dpkg will follow the symlink if
  810.   # there is one."
  811.   #
  812.   # We have to do it ourselves.
  813.   #
  814.   # This function moves the contents of old_location, a directory, into
  815.   # new_location, a directory, then makes old_location a symbolic link to
  816.   # new_location.
  817.   #
  818.   # old_location need not exist, but if it does, it must be a directory (or a
  819.   # symlink to a directory).  If it is not, it is backed up.  If new_location
  820.   # exists already and is not a directory, it is backed up.
  821.   #
  822.   # This function should be called from a package's preinst so that other
  823.   # packages unpacked after this one --- but before this package's postinst runs
  824.   # --- are unpacked into new_location even if their payloads contain
  825.   # old_location filespecs.
  826.  
  827.   # Validate arguments.
  828.   if [ $# -ne 2 ]; then
  829.     usage_error "migrate_dir_to_symlink() called with wrong number of"
  830.                 "arguments; expected 2, got $#"
  831.     exit $SHELL_LIB_USAGE_ERROR
  832.   fi
  833.  
  834.   # We could just use the positional parameters as-is, but that makes things
  835.   # harder to follow.
  836.   local _new _old
  837.  
  838.   _old="$1"
  839.   _new="$2"
  840.  
  841.   # Is old location a symlink?
  842.   if [ -L "$_old" ]; then
  843.     # Does it already point to new location?
  844.     if [ "$(readlink "$_old")" = "$_new" ]; then
  845.       # Nothing to do; migration has already been done.
  846.       observe "migration of $_old to $_new already done"
  847.       return 0
  848.     else
  849.       # Back it up.
  850.       warn "backing up symbolic link $_old as $_old.dpkg-old"
  851.       mv -b "$_old" "$_old.dpkg-old"
  852.     fi
  853.   fi
  854.  
  855.   # Does old location exist, but is not a directory?
  856.   if [ -e "$_old" ] && ! [ -d "$_old" ]; then
  857.       # Back it up.
  858.       warn "backing up non-directory $_old as $_old.dpkg-old"
  859.       mv -b "$_old" "$_old.dpkg-old"
  860.   fi
  861.  
  862.   observe "migrating $_old to $_new"
  863.  
  864.   # Is new location a symlink?
  865.   if [ -L "$_new" ]; then
  866.     # Does it point the wrong way, i.e., back to where we're migrating from?
  867.     if [ "$(readlink "$_new")" = "$_old" ]; then
  868.       # Get rid of it.
  869.       observe "removing symbolic link $_new which points to $_old"
  870.       rm "$_new"
  871.     else
  872.       # Back it up.
  873.       warn "backing up symbolic link $_new as $_new.dpkg-old"
  874.       mv -b "$_new" "$_new.dpkg-old"
  875.     fi
  876.   fi
  877.  
  878.   # Does new location exist, but is not a directory?
  879.   if [ -e "$_new" ] && ! [ -d "$_new" ]; then
  880.     warn "backing up non-directory $_new as $_new.dpkg-old"
  881.     mv -b "$_new" "$_new.dpkg-old"
  882.   fi
  883.  
  884.   # Create new directory if it does not yet exist.
  885.   if ! [ -e "$_new" ]; then
  886.     observe "creating $_new"
  887.     mkdir -p "$_new"
  888.   fi
  889.  
  890.   # Copy files in old location to new location.  Back up any filenames that
  891.   # already exist in the new location with the extension ".dpkg-old".
  892.   observe "copying files from $_old to $_new"
  893.   if ! (cd "$_old" && cp -a -b -S ".dpkg-old" . "$_new"); then
  894.     die "error(s) encountered while copying files from $_old to $_new"
  895.   fi
  896.  
  897.   # Remove files at old location.
  898.   observe "removing $_old"
  899.   rm -r "$_old"
  900.  
  901.   # Create symlink from old location to new location.
  902.   make_symlink_sane "$_old" "$_new"
  903. }
  904.  
  905. # vim:set ai et sw=2 ts=2 tw=80:
  906.  
  907. # GOBSTOPPER: The X Strike Force shell library ends here.
  908.  
  909. if [ -d /usr/share/X11/fonts ]; then
  910.     find /usr/share/X11/fonts -type f -name fonts.cache-1 -print0 | xargs -0r rm -f
  911.     find /usr/share/X11/fonts -type d -empty -delete || true
  912.     for dir in $(find /usr/share/X11/fonts -mindepth 1 -type d); do
  913.     if [ -z "$(find $dir -not -name fonts.dir -and -not -name fonts.scale \
  914.                  -and -not -name fonts.alias)" ]; then
  915.         rm -rf $dir
  916.     fi
  917.     done
  918. fi
  919.  
  920.  
  921.  
  922. exit 0
  923.